"""
解除一个装饰器

问题：
    一个装饰器已经作用在一个函数上，你想撤销它，直接访问原始的未包装的那个函数。
解决方案：
    假设装饰器是通过 @wraps 来实现的，那么你可以通过访问 __wrapped__ 属性来访问原始函数。
"""

import time
from functools import wraps


def compute_time(func):
    """
    计时装饰器函数
    :param func:
    :return:
    """

    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(func.__name__, end_time - start_time)
        return result

    return wrapper


@compute_time
def countdown(n):
    """
    倒数计秒
    :param n:
    :return:
    """
    while n > 0:
        n -= 1


def use_origin_func():
    origin_countdown = countdown.__wrapped__
    origin_countdown(100000)


if __name__ == "__main__":
    use_origin_func()
